package com.jy.rhin.domain.document.filter;

import lombok.Getter;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * @author dhl
 * @date 2022/6/7
 * @Description
 */
@Getter
public enum DocumentFilterDescEnum {
    /**
     * 元数据字段格式校验
     */
    FIELD_FORMAT(10000, "元数据字段格式校验", Arrays.asList(FilterType.PROVIDE, FilterType.REGISTER, FilterType.UPDATE)),
    /**
     * 标识符不重复校验
     */
    UNIQUE_ID_NOT_REPEAT(20000, "标识符不重复校验", Arrays.asList(FilterType.PROVIDE, FilterType.REGISTER)),
    /**
     * 文档id与文档条目id关联验证
     */
    CONTENT_ID_IN_ENTRY_LIST(30000, "文档id与文档条目id关联验证", Collections.singletonList(FilterType.PROVIDE)),
    /**
     * 文档内容hash/size/base64验证
     */
    CONTENT_VALID(40000, "文档内容hash/size/base64验证", Collections.singletonList(FilterType.PROVIDE)),
    /**
     * 提交集唯一性校验
     */
    SUBMISSION_SET_UNIQUENESS(50000, "提交集唯一性校验", Collections.singletonList(FilterType.REGISTER)),
    /**
     * 文档条目唯一性校验
     */
    ENTRY_UNIQUENESS(60000, "文档条目唯一性校验", Collections.singletonList(FilterType.REGISTER)),
    /**
     * 患者信息EMPI校验
     */
    PATIENT_UNIQUENESS(70000, "患者信息EMPI校验", Arrays.asList(FilterType.PROVIDE, FilterType.REGISTER, FilterType.UPDATE)),
    /**
     * 字段值存在值域内校验
     */
    MISC_UNIQUENESS(80000, "字段值存在值域内校验", Arrays.asList(FilterType.PROVIDE, FilterType.REGISTER, FilterType.UPDATE)),
    ;

    /**
     * 过滤器排序: 优先进行参数验证，再进行查库验证，最后进行关联系统验证
     * 存在依赖关系的情况下，按照依赖顺序调整
     */
    private final int sort;
    private final String filterName;
    private final List<FilterType> filterType;

    DocumentFilterDescEnum(int sort, String filterName, List<FilterType> filterType) {
        this.sort = sort;
        this.filterName = filterName;
        this.filterType = filterType;
    }

    @Getter
    public enum FilterType {
        /**
         * 文档注册
         */
        REGISTER("文档注册"),
        /**
         * 文档提交
         */
        UPDATE("文档元数据更新"),
        /**
         * 文档提交
         */
        PROVIDE("文档提交"),
        ;

        private final String typeName;

        FilterType(String typeName) {
            this.typeName = typeName;
        }
    }

}
